﻿using System;
using System.Collections.Generic;

namespace HaloReachApi.Responses
{
    public class FileResponse : ReachResponseBase
    {
        public ReachFile[] Files { get; set; }
        public ReachFileSet[] FileSets { get; set; }
    }

    /// <summary>
    /// Medal Info
    /// </summary>

    public class Medal
    {
        public string Description { get; set; }
        public int Id { get; set; }
        public string ImageName { get; set; }
        public string Name { get; set; }
    }


    public class ReachFile
    {
        public string Author { get; set; }
        public DateTime CreateDate { get; set; }
        public string Description { get; set; }
        public string FileCategory { get; set; }
        public string FileDetailsUrl { get; set; }
        public long FileId { get; set; }
        public uint MapId { get; set; }
        public DateTime ModifiedDate { get; set; }
        public string OriginalAuthor { get; set; }
        public string RenderedWMVPath { get; set; }
        public string RenderJobResolution { get; set; }
        public string RenderJobStatus { get; set; }
        public string ScreenshotFullSizeUrl { get; set; }
        public string ScreenshotMediumUrl { get; set; }
        public string ScreenshotThumbnailUrl { get; set; }
        public string Title { get; set; }
    }

    public class ReachFileSet
    {
        public long Id { get; set; }
        public string Name { get; set; }
    }

    public class PlayerDetailsResponse : ReachResponseBase
    {
        public PlayerAiAggregateDetailReach[] AiStatistics { get; set; }
        public PlayerArenaDetail[] CurrentSeasonArenaStatistics { get; set; }
        public int CurrentRankIndex { get; set; }
        public PlayerDetailReachAggregate Player { get; set; }
        public string PlayerModelUrl { get; set; }
        public string PlayerModelUrlHiRes { get; set; }
        public PlayerArenaDetail[] PriorSeasonArenaStatistics { get; set; }
        public PlayerAggregateDetailReach[] StatisticsByMap { get; set; }
        public PlayerAggregateDetailReach[] StatisticsByPlaylist { get; set; }
    }

    public class CurrentChallengesResponse : ReachResponseBase // Added by jubizo
    {
        public DailyChallenges[] Daily { get; set; }
        public WeeklyChallenge[] Weekly { get; set; }
    }

    public class DailyChallenges // Added by jubizo
    {
        public int Credits { get; set; }
        public string Description { get; set; }
        public DateTime ExpirationDate { get; set; }
        public bool IsWeeklyChallenge { get; set; }
        public string Name { get; set; }
    }

    public class WeeklyChallenge // Added by jubizo
    {
        public int Credits { get; set; }
        public string Description { get; set; }
        public DateTime ExpirationDate { get; set; }
        public bool IsWeeklyChallenge { get; set; }
        public string Name { get; set; }
    }

    public class PlayerAggregateDetailReach
    {
        public System.Collections.Generic.Dictionary<GameEventDamageType, int> DeathsByDamageType { get; set; }
        public int game_count { get; set; }
        public int high_score { get; set; }
        public ushort? HopperId { get; set; }
        public System.Collections.Generic.Dictionary<GameEventDamageType, int> KillsByDamageType { get; set; }
        public int? MapId { get; set; }
        public float MedalChestCompletionPercentage { get; set; }
        public System.Collections.Generic.Dictionary<int, int> MedalCountsByType { get; set; }
        public int season_id { get; set; }
        public int total_assists { get; set; }
        public int total_betrayals { get; set; }
        public int total_deaths { get; set; }
        public int total_first_place { get; set; }
        public int total_kills { get; set; }
        public TimeSpan total_playtime { get; set; }
        public long total_score { get; set; }
        public int total_top_half_place { get; set; }
        public int total_top_third_place { get; set; }
        public int total_wins { get; set; }
        public int TotalMedals { get; set; }
        public ReachGameVariantClass VariantClass { get; set; }
    }

    public enum GameEventDamageType
    {

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Invalid = 0,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        KnownGuardians = 1,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Scripting = 2,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        AiSuicide = 3,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        MagnumPistol = 4,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        AssaultRifle = 5,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        MarksmanRifle = 6,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Shotgun = 7,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        SniperRifle = 8,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        RocketLauncher = 9,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        SpartanLaser = 10,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        FragGrenade = 11,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        GrenadeLauncher = 12,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        PlasmaPistol = 13,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Needler = 14,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        PlasmaRifle = 15,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        PlasmaRepeater = 16,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        NeedleRifle = 17,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        SpikeRifle = 18,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        PlasmaLauncher = 19,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        GravityHammer = 20,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        EnergyBlade = 21,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        PlasmaGrenade = 22,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        PlasmaShot = 23,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Ghost = 24,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        RevenantDriver = 25,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        RevenantGunner = 26,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Wraith = 27,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        WraithAntiInfantry = 28,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Banshee = 29,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        BansheeBomb = 30,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Seraph = 31,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Mongoose = 32,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        WarthogDriver = 33,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        WarthogGunner = 34,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        WarthogGunnerGauss = 35,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        WarthogGunnerRocket = 36,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Scorpion = 37,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        ScorpionGunner = 38,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        FalconDriver = 39,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        FalconGunner = 40,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        FallingDamage = 41,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        CollisionDamage = 42,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Melee = 43,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Explosion = 44,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        BirthdayPartyExplosion = 45,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Flag = 46,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Bomb = 47,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        BombExplosion = 48,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Ball = 49,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Teleporter = 50,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        TransferDamage = 51,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        ArmorLockCrush = 52,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Airstrike = 53,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        HumanTurret = 54,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        PlasmaCannon = 55,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        PlasmaMortar = 56,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        PlasmaTurret = 57,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        ShadeTurret = 58,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Excavator = 59,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Smg = 60,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        BattleRifle = 61,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Carbine = 62,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        BeamRifle = 63,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        FlakCannon = 64,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        MissileLauncher = 65,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        BruteShot = 66,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        FlameThrower = 67,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        SentinelGun = 68,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        ClaymoreGrenade = 69,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        FirebombGrenade = 70,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        ElephantTurret = 71,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        SpectreDriver = 72,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        SpectreGunner = 73,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Tank = 74,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Chopper = 75,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Hornet = 76,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Mantis = 77,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Mauler = 78,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        SentinelBeam = 79,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        SentinelRpg = 80,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        ProximityMine = 81,
    }

    public class PlayerArenaDetail
    {
        public int current_daily_rating { get; set; }
        public ArenaDivision division { get; set; }
        public short? division_percentile { get; set; }
        public int game_count { get; set; }
        public string playlist_system_name { get; set; }
        public int qualifying_days { get; set; }
        public int required_daily_games { get; set; }
        public int required_days { get; set; }
        public int seasonID { get; set; }
    }

    public enum ArenaDivision
    {

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Nothing = 0,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Iron = 1,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Bronze = 2,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Silver = 3,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Gold = 4,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Onyx = 5,
    }

    public class PlayerDetailReachAggregate : PlayerDetailReachBasic
    {
        public float commendation_completion_percentage { get; set; }
        public System.Collections.Generic.Dictionary<int, short> CommendationState { get; set; }
    }

    public class PlayerAiAggregateDetailReach
    {
        public int biggest_kill_points { get; set; }
        public short biggest_kill_streak { get; set; }
        public System.Collections.Generic.Dictionary<CampaignEnemyTypeClassReach, int> DeathsByEnemyTypeClass { get; set; }
        public ReachDifficultyDisplayBucket game_difficulty { get; set; }
        public int high_score_coop { get; set; }
        public int high_score_solo { get; set; }
        public short highest_game_kills { get; set; }
        public short highest_set { get; set; }
        public float highest_skull_multiplier { get; set; }
        public System.Collections.Generic.Dictionary<CampaignEnemyTypeClassReach, int> KillsByEnemyTypeClass { get; set; }
        public System.Collections.Generic.Dictionary<GameEventDamageType, long> PointsByDamageType { get; set; }
        public System.Collections.Generic.Dictionary<CampaignEnemyTypeClassReach, long> PointsByEnemyTypeClass { get; set; }
        public int total_enemy_players_killed { get; set; }
        public int total_generators_destroyed { get; set; }
        public int total_missions_beating_par { get; set; }
        public int total_missions_not_dying { get; set; }
        public long total_score_coop { get; set; }
        public long total_score_solo { get; set; }
        public int total_waves_completed { get; set; }
    }

    public enum ReachDifficultyDisplayBucket
    {

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Easy = 0,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Normal = 1,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Heroic = 2,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Legendary = 3,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        All = 255,
    }

    public class GameDetailsResponse : ReachResponseBase
    {
        public Game GameDetails { get; set; }
    }

    public class Game
    {
        public string BaseMapName { get; set; }
        public string CampaignDifficulty { get; set; }
        public int CampaignGlobalScore { get; set; }
        public bool CampaignMetagameEnabled { get; set; }
        public int GameDuration { get; set; }
        public ulong GameId { get; set; }
        public DateTime GameTimestamp { get; set; }
        public ReachGameVariantClass GameVariantClass { get; set; }
        public long GameVariantHash { get; set; }
        public string GameVariantName { get; set; }
        public bool HasDetails { get; set; }
        public bool IsTeamGame { get; set; }
        public string MapName { get; set; }
        public long MapVariantHash { get; set; }
        public int PlayerCount { get; set; }
        public PlayerGameReach[] Players { get; set; }
        public string PlaylistName { get; set; }
        public TeamResultsReach[] Teams { get; set; }
    }

    public class PlayerGameReach
    {
        public System.Collections.Generic.Dictionary<CampaignEnemyTypeClassReach, AiEventAggregate> AiEventAggregates { get; set; }
        public short Assists { get; set; }
        public float AvgDeathDistanceMeters { get; set; }
        public float AvgKillDistanceMeters { get; set; }
        public short Betrayals { get; set; }
        public short Deaths { get; set; }
        public ulong[][] DeathsOverTime { get; set; }
        public bool DNF { get; set; }
        public short Headshots { get; set; }
        public sbyte IndividualStandingWithNoRegardForTeams { get; set; }
        public bool IsGuest { get; set; }
        public int KilledMostByCount { get; set; }
        public int KilledMostCount { get; set; }
        public short Kills { get; set; }
        public ulong[][] KillsOverTime { get; set; }
        public ulong[][] MedalsOverTime { get; set; }
        public int? MultiMedalCount { get; set; }
        public int? OtherMedalCount { get; set; }
        public int PlayerDataIndex { get; set; }
        public PlayerDetailReachBasic PlayerDetail { get; set; }
        public string PlayerKilledByMost { get; set; }
        public string PlayerKilledMost { get; set; }
        public ulong[][] PointsOverTime { get; set; }
        public short Rating { get; set; }
        public int Score { get; set; }
        public System.Collections.Generic.Dictionary<int, int> SpecificMedalCounts { get; set; }
        public int? SpreeMedalCount { get; set; }
        public sbyte Standing { get; set; }
        public int? StyleMedalCount { get; set; }
        public short? Suicides { get; set; }
        public byte Team { get; set; }
        public int TeamScore { get; set; }
        public int? TotalMedalCount { get; set; }
        public int? UniqueMultiMedalCount { get; set; }
        public int? UniqueOtherMedalCount { get; set; }
        public int? UniqueSpreeMedalCount { get; set; }
        public int? UniqueStyleMedalCount { get; set; }
        public int? UniqueTotalMedalCount { get; set; }
        public WeaponCarnageStats[] WeaponCarnageReport { get; set; }
    }

    public class PlayerDetailReachBasic
    {
        public float armor_completion_percentage { get; set; }
        public string CampaignProgressCoop { get; set; }
        public string CampaignProgressSp { get; set; }
        public int daily_challenges_completed { get; set; }
        public DateTime first_active { get; set; }
        public string gamertag { get; set; }
        public int games_total { get; set; }
        public bool Initialized { get; set; }
        public bool IsGuest { get; set; }
        public DateTime last_active { get; set; }
        public string LastGameVariantClassPlayed { get; set; }
        public ReachEmblem ReachEmblem { get; set; }
        public string service_tag { get; set; }
        public int weekly_challenges_completed { get; set; }
    }

    public class ReachEmblem
    {
        public byte background_index { get; set; }
        public byte[] change_colors { get; set; }
        public byte flags { get; set; }
        public byte foreground_index { get; set; }
    }

    public class WeaponCarnageStats
    {
        public short Deaths { get; set; }
        public short Headshots { get; set; }
        public short Kills { get; set; }
        public int Penalties { get; set; }
        public int WeaponId { get; set; }
    }

    public class AiEventAggregate
    {
        public CampaignEnemyTypeClassReach aiTypeClass { get; set; }
        public int PenaltyPoints { get; set; }
        public int PlayerBetrayedAiCount { get; set; }
        public float PlayerKilledAiAverageDistanceInMeters { get; set; }
        public int PlayerKilledAiCount { get; set; }
        public float[] PlayerKilledAiDistancesInMeters { get; set; }
        public float PlayerKilledAiPerHour { get; set; }
        public ulong[] PlayerKilledAiTimeIndexes { get; set; }
        public float PlayerKilledByAiAverageDistanceInMeters { get; set; }
        public int PlayerKilledByAiCount { get; set; }
        public float[] PlayerKilledByAiDistancesInMeters { get; set; }
        public ulong[] PlayerKilledByAiTimeIndexes { get; set; }
        public int Points { get; set; }
    }

    public enum CampaignEnemyTypeClassReach : int
    {

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Unknown = 0,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Brute_Infantry = 1,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Brute_Leader = 2,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Brute_Hero = 3,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Grunt_Infantry = 4,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Grunt_Specialist = 5,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Grunt_Hero = 6,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Jackal_Infantry = 7,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Jackal_Specialist = 8,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Jackal_Hero = 9,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Skirmisher_Infantry = 10,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Skirmisher_Specialist = 11,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Skirmisher_Leader = 12,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Marine_Infantry = 13,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Marine_Specialist = 14,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Marine_Hero = 15,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Spartan_Hero = 16,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Bugger_Infantry = 17,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Bugger_Leader = 18,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Bugger_Specialist = 19,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Hunter_Specialist = 20,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Elite_Infantry = 21,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Elite_Specialist = 22,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Elite_Leader = 23,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Elite_Hero = 24,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Engineer_Infantry = 25,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Mule_Infantry = 26,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Turret_LightVehicle = 27,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Mongoose_LightVehicle = 28,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Warthog_StandardVehicle = 29,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Scorpion_HeavyVehicle = 30,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Hornet_StandardVehicle = 31,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Pelican_HeavyVehicle = 32,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Revenant_StandardVehicle = 33,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Seraph_StandardVehicle = 34,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Shade_LightVehicle = 35,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Watchtower_LightVehicle = 36,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Ghost_LightVehicle = 37,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Wraith_HeavyVehicle = 38,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Banshee_StandardVehicle = 39,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Phantom_HeavyVehicle = 40,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Scarab_GiantVehicle = 41,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Guntower_LightVehicle = 42,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        TuningFork_HeavyVehicle = 43,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Elite_LightVehicle = 44,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Banshee_HeavyVehicle = 45,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        FloodCarrier_GiantVehicle = 46,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        FloodInfection_GiantVehicle = 47,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Phantom_StandardVehicle = 48,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Elite_GiantVehicle = 49,
    }

    public class TeamResultsReach
    {
        public ulong[][] DeathsOverTime { get; set; }
        public bool Exists { get; set; }
        public int Index { get; set; }
        public ulong[][] KillsOverTime { get; set; }
        public ulong[][] MedalsOverTime { get; set; }
        public int MetagameScore { get; set; }
        public int Score { get; set; }
        public sbyte Standing { get; set; }
        public short TeamTotalAssists { get; set; }
        public short TeamTotalBetrayals { get; set; }
        public short TeamTotalDeaths { get; set; }
        public short TeamTotalGameVariantCustomStat_1 { get; set; }
        public short TeamTotalGameVariantCustomStat_2 { get; set; }
        public short TeamTotalGameVariantCustomStat_3 { get; set; }
        public short TeamTotalGameVariantCustomStat_4 { get; set; }
        public short TeamTotalKills { get; set; }
        public int TeamTotalMedals { get; set; }
        public short TeamTotalSuicides { get; set; }
    }

    /// <summary>
    /// Game History response data holder.
    /// </summary>
    public class GameHistoryResponse : ReachResponseBase
    {
        public bool HasMorePages { get; set; }
        public List<GameSummary> RecentGames { get; set; }
    }

    /// <summary>
    /// Game summary info
    /// </summary>
    public class GameSummary
    {
        public string CampaignDifficulty { get; set; }
        public int CampaignGlobalScore { get; set; }
        public bool CampaignMetagameEnabled { get; set; }
        public int GameDuration { get; set; }
        public ulong GameId { get; set; }
        public DateTime GameTimestamp { get; set; }
        public ReachGameVariantClass GameVariantClass { get; set; }
        public long GameVariantHash { get; set; }
        public string GameVariantName { get; set; }
        public bool HasDetails { get; set; }
        public bool IsTeamGame { get; set; }
        public string MapName { get; set; }
        public long MapVariantHash { get; set; }
        public int PlayerCount { get; set; }
        public string PlaylistName { get; set; }
        public short RequestedPlayerAssists { get; set; }
        public short RequestedPlayerDeaths { get; set; }
        public short RequestedPlayerKills { get; set; }
        public short RequestedPlayerRating { get; set; }
        public int RequestedPlayerScore { get; set; }
        public int RequestedPlayerStanding { get; set; }
    }

    /// <summary>
    /// Game variant types
    /// </summary>
    public enum ReachGameVariantClass
    {
        /// <summary>
        /// 
        /// </summary>
        [System.Runtime.Serialization.EnumMemberAttribute()]
        Unknown = 0,

        /// <summary>
        /// 
        /// </summary>
        [System.Runtime.Serialization.EnumMemberAttribute()]
        Invasion = 1,

        /// <summary>
        /// 
        /// </summary>
        [System.Runtime.Serialization.EnumMemberAttribute()]
        Arena = 2,

        /// <summary>
        /// 
        /// </summary>
        [System.Runtime.Serialization.EnumMemberAttribute()]
        Competitive = 3,

        /// <summary>
        /// 
        /// </summary>
        [System.Runtime.Serialization.EnumMemberAttribute()]
        Campaign = 4,

        /// <summary>
        /// 
        /// </summary>
        [System.Runtime.Serialization.EnumMemberAttribute()]
        Firefight = 5,

        /// <summary>
        /// 
        /// </summary>
        [System.Runtime.Serialization.EnumMemberAttribute()]
        Custom = 6,
    }

    /// <summary>
    /// Game Meta data response holder.
    /// </summary>
    public class GameMetadataResponse : ReachResponseBase
    {
        public GameMetadata Data { get; set; }
    }

    /// <summary>
    /// Game Meta Data information
    /// </summary>
    public class GameMetadata
    {
        public System.Collections.Generic.Dictionary<int, Commendation> AllCommendationsById { get; set; }
        public System.Collections.Generic.Dictionary<int, Enemy> AllEnemiesById { get; set; }
        public System.Collections.Generic.Dictionary<uint, Map> AllMapsById { get; set; }
        public System.Collections.Generic.Dictionary<int, Medal> AllMedalsById { get; set; }
        public System.Collections.Generic.Dictionary<int, Weapon> AllWeaponsById { get; set; }
        public System.Collections.Generic.Dictionary<string, uint> GameVariantClassesKeysAndValues { get; set; }
        public System.Collections.Generic.Dictionary<uint, string> GlobalRanksById { get; set; } //added by me.
    }

    /// <summary>
    /// Commendation info
    /// </summary>
    public class Commendation
    {
        public short Bronze { get; set; }
        public string Description { get; set; }
        public short Gold { get; set; }
        public int Id { get; set; }
        public short Iron { get; set; }
        public short Max { get; set; }
        public string Name { get; set; }
        public short Onyx { get; set; }
        public short Silver { get; set; }
    }

    /// <summary>
    /// Enemy info
    /// </summary>

    public class Enemy
    {
        public string Description { get; set; }
        public int Id { get; set; }
        public string ImageName { get; set; }
        public string Name { get; set; }
    }

    /// <summary>
    /// Map info
    /// </summary>
    public class Map
    {
        public uint Id { get; set; }
        public string ImageName { get; set; }
        public string MapType { get; set; }
        public string Name { get; set; }
    }

    /// <summary>
    /// Weapon info
    /// </summary>
    public class Weapon
    {
        public string Description { get; set; }
        public int Id { get; set; }
        public string Name { get; set; }
    }

    /// <summary>
    /// The base class for Reach api responses.
    /// </summary>
    public class ReachResponseBase
    {
        public string reason { get; set; }
        public int status { get; set; }
    }
}


